﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs

''' <summary>
''' Classe représentant un traitement
''' </summary>
''' <remarks></remarks>
<Serializable()> Public MustInherit Class Traitement
    Inherits BaseNotifyPropertyChangeComponentModel
    Implements ITraitement

#Region "Variables de classe"

    Protected _lDependanceCorrespondances As List(Of Correspondance)

#End Region

#Region "Création d'une instance"
    ''' <summary>
    ''' Constructeur
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(ByVal nomTraitement As String, Optional ByVal DataSet As DataSet = Nothing)

        m_DataSet = DataSet
        _infosArgsTraitement = New BaseInfoTraitement(nomTraitement)
        AddHandler _infosArgsTraitement.FichierBDD_NomCompletChanging, AddressOf onFichierBDD_NomCompletChanging
        AddHandler _infosArgsTraitement.FichierBDD_NomCompletChanged, AddressOf onFichierBDD_NomCompletChanged
        AddHandler _infosArgsTraitement.NomTableDansBDDGet, AddressOf onNomTableDansBDDGet
        AddHandler _infosArgsTraitement.NomTableDansBDDChanged, AddressOf onNomTableDansBDDChanged
        AddHandler _infosArgsTraitement.NomTableDansBDDChanging, AddressOf onNomTableDansBDDChanging
        AddHandler _infosArgsTraitement.TempNomGet, AddressOf onTempNomGet
        AddHandler _infosArgsTraitement.TempNomChanged, AddressOf onTempNomChanged
        AddHandler _infosArgsTraitement.TempNomChanging, AddressOf onTempNomChanging

        'If Not univers Is Nothing Then
        '    _univers = univers
        '    _univers.ListeTraitements.Add(Me.nom, Me)
        'End If

        _FonctionCalculBDD = New FonctionCalculComposee(PTIC_Util.TypeRecalcul.SurOrdre, AddressOf execute_BDD)
        AddHandler _FonctionCalculBDD.EtatCalculChanged, AddressOf onEtatExecBDDValueChanged
        _FonctionCalculDataTable = New FonctionCalculComposee(PTIC_Util.TypeRecalcul.SurOrdre, AddressOf execute_DataTable)
        AddHandler _FonctionCalculDataTable.EtatCalculChanged, AddressOf onEtatExecDataTableValueChanged

        _lDependanceCorrespondances = New List(Of Correspondance)

    End Sub

#Region "Utilisé par les requêtes uniquement"
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(ByVal nomTraitement As String, _
                   ByVal nomFichier As Cla_NomFichier, _
                   ByVal nomTable As String, _
                   Optional ByVal univers As UniversBDD = Nothing)

        _infosArgsTraitement = New BaseInfoTraitement(nomTraitement)
        AddHandler _infosArgsTraitement.FichierBDD_NomCompletChanging, AddressOf onFichierBDD_NomCompletChanging
        AddHandler _infosArgsTraitement.FichierBDD_NomCompletChanged, AddressOf onFichierBDD_NomCompletChanged
        AddHandler _infosArgsTraitement.NomTableDansBDDGet, AddressOf onNomTableDansBDDGet
        AddHandler _infosArgsTraitement.NomTableDansBDDChanged, AddressOf onNomTableDansBDDChanged
        AddHandler _infosArgsTraitement.NomTableDansBDDChanging, AddressOf onNomTableDansBDDChanging
        AddHandler _infosArgsTraitement.TempNomGet, AddressOf onTempNomGet
        AddHandler _infosArgsTraitement.TempNomChanged, AddressOf onTempNomChanged
        AddHandler _infosArgsTraitement.TempNomChanging, AddressOf onTempNomChanging

        'If Not univers Is Nothing Then
        '    _univers = univers
        '    _univers.ListeTraitements.Add(Me.nom, Me)
        'End If

        FichierBDD.NomComplet = nomFichier.NomComplet
        Me.NomTableDansBDD = nomTable

        _FonctionCalculBDD = New FonctionCalculComposee(PTIC_Util.TypeRecalcul.SurOrdre, AddressOf execute_BDD)
        AddHandler _FonctionCalculBDD.EtatCalculChanged, AddressOf onEtatExecBDDValueChanged
        _FonctionCalculDataTable = New FonctionCalculComposee(PTIC_Util.TypeRecalcul.SurOrdre, _
                                                              AddressOf execute_DataTable)
        AddHandler _FonctionCalculDataTable.EtatCalculChanged, AddressOf onEtatExecDataTableValueChanged

        _lDependanceCorrespondances = New List(Of Correspondance)

    End Sub
#End Region

#End Region

#Region "DataSet / connection"

    Private m_DataSet As DataSet
    Public Property DataSet As DataSet Implements ITraitement.DataSet
        Get
            Return m_DataSet
        End Get
        Set(ByVal value As DataSet)
            m_DataSet = value
        End Set
    End Property

    Private _connection As OleDb.OleDbConnection
    ''' <summary>
    ''' Renvoie l'objet oleDBconnection permettant de se connecter à la table physique pour faire
    ''' des requêtes
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Connection() As OleDb.OleDbConnection Implements ITraitement.Connection
        Get
            Return _connection
        End Get
        Set(ByVal value As OleDb.OleDbConnection)
            _connection = value
        End Set
    End Property
#End Region

#Region "Liste des champs en sortie"
    Private _listeChampsSortie As baseListeChampsSortie
    ''' <summary>
    ''' Liste des champs disponibles en sortie du traitement
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property ListeChampsSortie() As baseListeChampsSortie Implements ITraitement.ListeChampsSortie
        Get
            Return _listeChampsSortie
        End Get
    End Property
    Protected Sub SetListeChampsSortie(ByVal value As baseListeChampsSortie)
        OnPropertyChanging("ListeChampsSortie")
        _listeChampsSortie = value
        OnPropertyChanged("ListeChampsSortie")
        AddHandler _listeChampsSortie.AjoutChamps, AddressOf onListeChampsSortie_AjoutChamps
        AddHandler _listeChampsSortie.SuppressionChamps, AddressOf onListeChampsSortie_SuppressionChamps
    End Sub

    ''' <summary>
    ''' Gérer l'ajout d'un champs dans la liste des champs en sortie
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub onListeChampsSortie_AjoutChamps(ByVal sender As Object, ByVal e As listeChampsEventArgs) Implements ITraitement.onListeChampsSortie_AjoutChamps
        invalideAll()
    End Sub

    ''' <summary>
    ''' Gérer la suppression d'un champs dans la liste des champs en sortie
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub onListeChampsSortie_SuppressionChamps(ByVal sender As Object, ByVal e As listeChampsEventArgs) Implements ITraitement.onListeChampsSortie_SuppressionChamps
        invalideAll()
    End Sub
#End Region

#Region "Etat d'exécution"

    Private WithEvents _FonctionCalculDataTable As IFonctionCalculComposee
    ''' <summary>
    ''' Gère le calcul du traitement sous forme de DataTable
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FonctionCalculDataTable As IFonctionCalculComposee
        Get
            Return _FonctionCalculDataTable
        End Get
        Set(ByVal value As IFonctionCalculComposee)
            _FonctionCalculDataTable = value
        End Set
    End Property

    Protected _DataTableResultats As DataTable
    ''' <summary>
    ''' DataTable contenant les résultats du traitement. Attention, cette DataTable peut ne pas être
    ''' à jour si la fonction de calcul de la DataTable n'est pas à jour
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property DataTableResultat As DataTable Implements ITraitement.DataTableResultat
        Get
            'FonctionCalculDataTable.Calculer()
            Return _DataTableResultats
        End Get
    End Property
    Friend Sub SetDataTableResultat(ByVal value As DataTable)
        _DataTableResultats = value
        OnPropertyChanged("DataTableResultat")
    End Sub

    ''' <summary>
    ''' Etat de l'exécution du traitement dans l'univers de travail
    ''' </summary>
    ''' <remarks></remarks>
    Public ReadOnly Property EtatCalcul_DataTable() As ValueEtatCalcul Implements ITraitement.EtatCalcul_DataTable
        Get
            Return _FonctionCalculDataTable.EtatCalcul
        End Get
    End Property

    ''' <summary>
    ''' Mode de recalcul de la fonction permettant de créer la DataTable
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ModeRecalculDataTable As TypeRecalcul Implements ITraitement.ModeRecalculDataTable
        Get
            Return _FonctionCalculDataTable.ModeRecalcul
        End Get
        Set(ByVal value As TypeRecalcul)
            _FonctionCalculDataTable.ModeRecalcul = value
        End Set
    End Property

    Public Sub Calculer_DataTable() Implements ITraitement.Calculer_DataTable
        _FonctionCalculDataTable.Calculer()
    End Sub


    Private WithEvents _FonctionCalculBDD As IFonctionCalculComposee
    ''' <summary>
    ''' Gère le calcul du traitement au niveau de la base de données
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FonctionCalculBDD As IFonctionCalculComposee
        Get
            Return _FonctionCalculBDD
        End Get
        Set(ByVal value As IFonctionCalculComposee)
            _FonctionCalculBDD = value
        End Set
    End Property

    ''' <summary>
    ''' Etat de l'exécution du traitement dans la base de données
    ''' </summary>
    ''' <remarks></remarks>
    Public ReadOnly Property EtatCalcul_BDD() As ValueEtatCalcul Implements ITraitement.EtatCalcul_BDD
        Get
            Return _FonctionCalculBDD.EtatCalcul
        End Get
    End Property

    Public Sub Calculer_BDD() Implements ITraitement.Calculer_BDD
        _FonctionCalculBDD.Calculer()
    End Sub

    ''' <summary>
    ''' Exécute le traitement en local dans l'outil
    ''' </summary>
    ''' <remarks></remarks>
    Protected MustOverride Sub execute_DataTable()
    ''' <summary>
    ''' Exécute le traitement dans la base de données
    ''' </summary>
    ''' <remarks></remarks>
    Protected MustOverride Sub execute_BDD()

    ''' <summary>
    ''' Invalider le traitement
    ''' </summary>
    ''' <remarks></remarks>
    Public Overridable Sub invalideAll() Implements ITraitement.invalideAll
        FonctionCalculBDD.Invalider()
        FonctionCalculDataTable.Invalider()
        'Invalider les traitements dépendants
        RaiseEvent Invalidated(Me, New EventArgs)
    End Sub

    ''' <summary>
    ''' Ajouter une dépendance au traitement
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub addDependance(ByVal dependance As Correspondance) Implements ITraitement.addDependance
        If Not _lDependanceCorrespondances.Contains(dependance) Then
            _lDependanceCorrespondances.Add(dependance)
            AddHandler dependance.CorrespChanged, AddressOf onDependanceChanged
        End If
    End Sub

    ''' <summary>
    ''' Gérer un changement d'état d'une dépendance
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overridable Sub onDependanceChanged(ByVal sender As Object, ByVal e As GenerateCorrespEventArgs)
        invalideAll()
    End Sub

#End Region

#Region "Caractéristiques physiques"
    Private _infosArgsTraitement As IInfosTraitement

    ''' <summary>
    ''' Nom du traitement
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property nom() As String Implements ITraitement.nom
        Get
            Return _infosArgsTraitement.nom
        End Get
    End Property

    ''' <summary>
    ''' Fichier physique attaché au traitement
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property FichierBDD() As Cla_NomFichier Implements ITraitement.FichierBDD
        Get
            Return _infosArgsTraitement.FichierBDD
        End Get
    End Property
    Private Sub onFichierBDD_NomCompletChanging(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String))
        RaiseEvent FichierBDD_NomCompletChanging(Me, e)
    End Sub
    Private Sub onFichierBDD_NomCompletChanged(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String))
        RaiseEvent FichierBDD_NomCompletChanged(Me, e)
    End Sub
    Public Event FichierBDD_NomCompletChanging As PropertyChangeEventHandler(Of String) Implements ITraitement.FichierBDD_NomCompletChanging
    Public Event FichierBDD_NomCompletChanged As PropertyChangeEventHandler(Of String) Implements ITraitement.FichierBDD_NomCompletChanged

    ''' <summary>
    ''' Nom, dans l'univers de base de données, de la table physique attachée au traitement
    ''' </summary>
    ''' <value></value>
    ''' <returns>Nom de la table associée au traitement</returns>
    ''' <remarks>Exemple pour une table ou une requête SAS : MyLib.nomTable (nom par rapport à l'univers SAS)</remarks>
    Public Property NomTableDansBDD() As String Implements ITraitement.NomTableDansBDD
        Get
            Return _infosArgsTraitement.NomTableDansBDD
        End Get
        Set(ByVal value As String)
            _infosArgsTraitement.NomTableDansBDD = value
        End Set
    End Property
    Private Sub onNomTableDansBDDGet(ByVal sender As Object, ByVal e As PropertyGetEventArgs(Of String))
        RaiseEvent NomTableDansBDDGet(Me, e)
    End Sub
    Private Sub onNomTableDansBDDChanging(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String))
        RaiseEvent NomTableDansBDDChanging(Me, e)
    End Sub
    Private Sub onNomTableDansBDDChanged(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String))
        OnPropertyChanged("NomTableDansBDD")
        RaiseEvent NomTableDansBDDChanged(Me, e)
    End Sub
    Public Event NomTableDansBDDGet As PropertyGetEventHandler(Of String) Implements ITraitement.NomTableDansBDDGet
    Public Event NomTableDansBDDChanging As PropertyChangeEventHandler(Of String) Implements ITraitement.NomTableDansBDDChanging
    Public Event NomTableDansBDDChanged As PropertyChangeEventHandler(Of String) Implements ITraitement.NomTableDansBDDChanged

    ''' <summary>
    ''' Nom temporaire du traitement utilisée lors de l'exécution d'une requête utilisant des jointures
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Friend Property TempNom() As String
        Get
            Return _infosArgsTraitement.TempNom
        End Get
        Set(ByVal value As String)
            _infosArgsTraitement.TempNom = value
        End Set
    End Property
    Private Sub onTempNomGet(ByVal sender As Object, ByVal e As PropertyGetEventArgs(Of String))
        RaiseEvent TempNomGet(Me, e)
    End Sub
    Private Sub onTempNomChanging(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String))
        RaiseEvent TempNomChanging(Me, e)
    End Sub
    Private Sub onTempNomChanged(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String))
        RaiseEvent TempNomChanged(Me, e)
    End Sub
    Public Event TempNomGet As PropertyGetEventHandler(Of String) Implements ITraitement.TempNomGet
    Public Event TempNomChanging As PropertyChangeEventHandler(Of String) Implements ITraitement.TempNomChanging
    Public Event TempNomChanged As PropertyChangeEventHandler(Of String) Implements ITraitement.TempNomChanged
#End Region

#Region "Gestion des évènements reçus de l'extérieur"
    Private Sub onEtatExecDataTableValueChanged(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent EtatCalculDataTableAChange(Me, e)
    End Sub
    Private Sub onEtatExecBDDValueChanged(ByVal sender As Object, ByVal e As EventArgs)
        'RaiseEvent etatAchange(Me, New notifTraitement(Traitement.notifTraitement.natureChangement.etatCalculBDDAchange))
        RaiseEvent EtatCalculBDDAchange(Me, e)
    End Sub
#End Region

#Region "Evènements générés par la classe"
    Public Event EtatCalculDataTableAChange As EventHandler Implements ITraitement.EtatCalculDataTableAChange
    Protected Sub RaiseEventEtatCalculDataTableAChange(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent EtatCalculDataTableAChange(sender, e)
    End Sub
    Public Event EtatCalculBDDAchange As EventHandler Implements ITraitement.EtatCalculBDDAchange
    Protected Sub RaiseEventEtatCalculBDDAchangeAChange(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent EtatCalculBDDAchange(sender, e)
    End Sub
    Public Event Invalidated As EventHandler Implements ITraitement.Invalidated
#End Region

End Class